package com.fwtai.service;

import com.fwtai.web.GoodsAreaDao;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**门店商品及商品对应的优惠券规则的库存*/
@Service
public final class ServiceCouponStore{

  private final GoodsAreaDao goodsAreaDao;

  private final ServiceCouponArea serviceCouponArea;

  public ServiceCouponStore(final GoodsAreaDao goodsAreaDao,final ServiceCouponArea serviceCouponArea){
    this.goodsAreaDao = goodsAreaDao;
    this.serviceCouponArea = serviceCouponArea;
  }

  public List<HashMap<String,Object>> getStoreCoupon(final HashMap<String,Object> result,final long userId,final long out_trade_no){
    final Integer type = (Integer)result.get("type");//其实就是sys_area.level的值
    final boolean custom = result.containsKey("area_id");//是否存在表partner的字段area_id,存在说明所代理的是特殊区域
    final Long areaId = custom ? serviceCouponArea.getAreaId(result,8) : serviceCouponArea.getAreaId(result,type);//传入数字8的目的是拿area_id的值,也就是case的default
    if(areaId == null){
      return null;
    }
    final List<HashMap<String,Object>> list = goodsAreaDao.getGoodsCoupon();//全国默认的优惠券发放规则,由商品id及商品优惠券构成多种商品
    //获取商品id
    final Long[] goodsIds = new Long[list.size()];
    for(int i = list.size() - 1; i >= 0; i--){
      goodsIds[i] = (Long) list.get(i).get("kid");//kid是商品id
    }
    //我仅勾选省级,默认就包含所有市，及所有的市的所有区，也就是包含整个省;以最小被勾选的区域优先级最高
    final HashMap<String,Object> params = new HashMap<>(2);
    params.put("array",goodsIds);
    final ArrayList<Long> areaIds = new ArrayList<>(4);
    //判断代理商所代理的区域是否是设定为特殊区域,即是否取表partner的字段area_id的值
    if(custom){//是代理的是特殊区域,则通过表partner的字段area_id的值与sys_area查询区域的等级level,然后查询该区域的所有的上级区域,↓↓↓
      final Integer level = goodsAreaDao.getAreaLevel(areaId);//通过表partner的字段area_id的值与sys_area查询区域的等级level,即level的值,然后查询该区域的所有的上级区域,如果level=1时那areaId就是本身
      if(level != 1){//通过areaId查询sys_area的字段level如果不是1则查询该区域的所有的上级区域;如果是1则直接就是省级代理,直接取值即可
        final HashMap<String,Object> areaMap = goodsAreaDao.getAreaCustom(level,areaId);//然后查询该区域的所有的上级区域(即表partner的字段area_id的值)
        if(areaMap == null){
          return null;
        }
        serviceCouponArea.getCustomId(areaMap,level,areaIds);
      }else{
        areaIds.add(areaId);//通过areaId查询sys_area的字段level=1时,那areaId就是本身,直接取值即可
      }
    }else{
      areaIds.add((Long) result.get("province_id"));
      areaIds.add((Long) result.get("city_id"));
      areaIds.add((Long) result.get("county_id"));
    }
    params.put("areaIds",areaIds);
    //通过普通区域省(province_id)、市(city_id)、区(county_id)或特殊区域的area_id的id查询优惠券发放规则表，判断已哪一个规则发放优惠券,只取优惠券表coupon的goods_id和type最大值MAX(type),因为优先级是字段type从大到小
    final List<HashMap<String,Object>> listAreaCoupon = goodsAreaDao.getAreaCoupon(params);//商品id及区域id,获取优惠券规则
    if(!listAreaCoupon.isEmpty()){//优惠券设定区域不为空时替换默认的优惠券规则
      serviceCouponArea.replaceCoupon(list,listAreaCoupon);
    }
    //获取订单商品及商品优惠券数量,替换新增商品列表中商品一致替换原有
    final List<HashMap<String,Object>> maps = goodsAreaDao.getOrderCoupon(out_trade_no);
    serviceCouponArea.replaceCoupon(list,maps);
    final List<HashMap<String,Object>> goodsRecord = goodsAreaDao.getStoreCoupon(userId);//获取已存在的商品及商品优惠券数量(由商品id及商品的多个优惠券数量构成多种商品规格)
    if(goodsRecord.size() > 0){//若已存在的商品的则移除掉，即仅需同步过的商品及商品对应的商品优惠券数据(同一个userId通过`商品`及`商品对应的商品优惠券数据`来确定为商品规格,即唯一)
      serviceCouponArea.replaceValue(goodsRecord,list);
    }
    return list;
  }
}